#!/usr/bin/env python
#coding:utf-8

import  tornado.web
from tornado import escape

class Application(tornado.web.Application):
    
    
    def __call__(self, request):
        
        """Called by HTTPServer to execute the request."""
        transforms = [t(request) for t in self.transforms]
        handler = None
        args = []
        kwargs = {}
        handlers = self._get_host_handlers(request)
        if not handlers:
            handler = tornado.web.RedirectHandler(
                self, request, url="http://" + self.default_host + "/")
        else:
            for spec in handlers:
                match = spec.regex.match(request.path)
                if match:
                    # None-safe wrapper around url_unescape to handle
                    # unmatched optional groups correctly
                    def unquote(s):
                        if s is None: return s
                        return escape.url_unescape(s, encoding=None)
                    #match.groups() get controller and action to reflact to get .py and class
                    handler = spec.handler_class(self, request, **spec.kwargs)
                    # Pass matched groups to the handler.  Since
                    # match.groups() includes both named and unnamed groups,
                    # we want to use either groups or groupdict but not both.
                    # Note that args are passed as bytes so the handler can
                    # decide what encoding to use.
                    kwargs = dict((k, unquote(v))
                                  for (k, v) in match.groupdict().iteritems())
                    if kwargs:
                        args = []
                    else:
                        args = [unquote(s) for s in match.groups()]
                    break
            if not handler:
                handler = tornado.web.ErrorHandler(self, request, status_code=404)
        '''
        # In debug mode, re-compile templates and reload static files on every
        # request so you don't need to restart to see changes
        if self.settings.get("debug"):
            if getattr(tornado.web.RequestHandler, "_templates", None):
                #for loader in tornado.web.RequestHandler._templates.values():
                #    loader.reset()
                for loader in  tornado.web.RequestHandler._templates.values():
                    loader.reset()
            tornado.web.RequestHandler._static_hashes = {}
        '''
        handler._execute(transforms, *args, **kwargs)
        return handler